var isEqual = require('./isEqual')
var includeArrays = require('../Array/includeArrays')

/**
 * 判断属性中的键和值是否包含在对象中
 * 1.若source为空，则返回true
 * 2.若source中有一个键不存在于obj中，则返回false
 * 3.若source中的键都存在于obj中，且值能一一对应，则返回true
 * @param {*} obj
 * @param {*} source
 * @returns
 */
function isMatch(obj, source) {
  // 1.获取对象的 key
  const k1 = Object.keys(obj)
  const k2 = Object.keys(source)

  // 2.若source无值，则直接返回true
  if (!k2.length) return true

  // 3.若待匹配项中存在key值与被匹配项对应，则说明键对应得上（说明k1包含k2）
  if (includeArrays(k1, k2)) {
    return k2.some((key) => {
      // 4.匹配键值，只要有一个键值对应得上，则返回true
      return isEqual(obj[key], source[key])
    })
  }

  // for (let key of k2) {
  //   if (!k1.includes(key)) return false
  //   if (isEqual(obj[key], source[key])) return true
  // }

  // 5.除对象和数组之外的特殊情况判断
  return isEqual(obj, source)
}

module.exports = isMatch

// console.log(isMatch({ bb: 22 }, { aa: 11, bb: 22 })) // false
// console.log(isMatch({ aa: 11, bb: 22 }, { bb: 22 })) // true
// console.log(isMatch({ aa: 11, bb: 22 }, { bb: 33 })) // false
// console.log(isMatch([1], { 0: 1 })) // true
console.log(isMatch({ aa: 11, bb: 22 }, { aa: 22, bb: 22 })) // true
console.log(isMatch({ aa: 11, bb: 22 }, { cc: 22, bb: 22 })) // false
